Clasificación con regresión logística

Primer conjunto de datos: frontera de decisión lineal.

Vamos a empezar con un primer conjunto. El fichero que contiene los datos es ejemplo-logistica-1.csv que se puede descargar del Aula Virtual y guardar en la carpeta data del directorio asociado a nuestro nuevo proyecto.

El conjunto presenta dos características x1 y x2, que queremos usar para poder predecir la variable binaria y.

Llevad a cabo la representación gráfica del conjunto, usando un color distinto para distinguir entre los valores de y.

Cúantos etiquetas de 0 y de 1 hay en el conjunto?

Ajuste paso a paso de una regresión logística.

En esta parte, vamos a aprender a ajustar una regresión logística a nuestros datos. Lo hacemos usando en sklearn la clase LogisticRegression del súbmodulo linear_model

Para ilustrar, vamos a ajustarlo sobre todo el conjunto. Después de definir X e y, instanciar el estimador dándole el nombre log_reg, y ajustarlo a los datos

Podemos consultar los coeficientes y la ordenada con los atributos coef_ y intercept_, al igual que lo hicimos para LinearRegression.

Deducir de estos valores la ecuación explícita de la recta que sirve de frontera de decisión para nuestro algoritmo

Usando axline, añadid a la gráfica la frontera de decisión

Medidas de calidad del ajuste

Para medir la calidad de nuestro algoritmo, tal como lo vimos en la unidad anterior, podemos usar la validación cruzada, correspondiente a cross_val_scores del súbmodulo model_selection, pero esta vez, al ser el problema de clasificación, vamos a usar scoring='accuracy' que calcula el proporción de veces que la clasificación acierta.

Aplicar validación cruzada con 5 "folds" al conjunto, usando nuestro estimador log_reg, y guardar las puntuaciones en un objecto llamado scores.

Los resultados son buenísimos, pero estos indicadores son demasiado sumarios. Imaginad que hubiéramos escogido como regla de clasificación que todos los datos son 0. Habríamos tenido un tasa de acierto de más del 90% que, a priori es muy buena!

Por ello, lo que se hace es, para empezar, comprobar la matriz de confusión, que nos dice cuántas veces hemos clasificado un 0 como un 1, un 0 como un 1, un 1 como un 0 y un 1 como un 1. En inglés corresponde a

Para construir esta matriz, necesitamos las predicciones de cada individuo. Si queremos hacerlo con validación cruzada (lo recomendable), usamos cross_val_predict del súbmodulo model_selection. En la validación cruzada, por ejemplo con 5 folds, cada individuo entra 4 veces en un subconjunto de aprendizaje y sólo una vez en un subconjunto de tipo test, en el que se realiza la predicción. cross_val_predict devuelve el vector de los valores predichos durante el proceso de validación cruzada

Después de importar cross_val_predict, construir el vector y_pred que contenga los valores predichos durante el proceso de validación cruzada. Referencia de cross_val_predict.

Podemos ahora calcular la matriz de confusión, importando confusion_matrix del submódulo metrics. Referencia

Deducid de esta matrix la precisión, es decir la tasa de Verdaderos Positivos (TP) respecto a todos los predichos como positivos, (TP + FP). Asignadla a un objeto que llamaremos precision

Calculad la sensibilidad, es decir la tasa de individuos clasificados como Positivos (TP) respecto a auténticos positivos en el conjunto, (TP + FN). Asignadla a un objeto que llamaremos sensibilidad

Se pueden calcular automáticamente con scikit-learn usando precision_score y recall_score del submódulo metrics. Le pasamos como argumentos y_pred e y. Asignamos sus valores a puntuacion_precision y puntuacion_recall.

Clasificación de un nuevo individuo

Supongamos que tenemos un nuevo individuo cuyas características son x1=3 y x2=2. Predecir la etiqueta de y, y calcular la probabilidad estimada asociada que se obtiene con el método predict_proba que se aplica a nuestro estimador.

Representación de la probabilidad predicha en función de los valores de x1 y x2

Vamos a usar el método predict_proba para calcular la probabilidad asigna por nuestro modelo a los valores de la región y visualizarlos usando un mapa de calor. Vamos a construir una rejilla de n_puntos por n_puntos en el rango de valores de x1 y x2, y calcularemos para cada par de valores en la rejilla la probabilidad predicha por nuestro estimador. A continuación los representaremos usando el color para distinguir los valores de la probabilidad. Situamos el código necesario en una función:

Representamos la visualización para nuestro modelo log_reg usando esta función

Segundo ejemplo, frontera de decisión cuadrática

Descargad el fichero ejemplo-logistica-2.csv y cargadlo en un DataFrame llamado datos. Representad x2 frente a x1, distinguiendo según el valor de y.

Ajuste de una regresión logística con características polinomiales de grado 2.

Usando el transformador PolynomialFeatures del súbmodulo preprocessing, cread un pipeline que calcule los términos polinomiales de grado 2 y a continuación aplique una regresión lógistica.

Usaremos el argumento include_bias=False en PolynomialFeatures, para que no añada una columna de 1 a nuestra matriz de características, puesto que la regresión logística ya se encarga de ello.

Aplicadlo al conjunto de datos, definiendo X e y. Escribid la ecuación implícita de la frontera de la región de decisión.

Obtened la matriz de confusión, después de usar validación cruzada para predecir los valores en el conjunto

Finalmente, usad la función visualizar_proba_pred para visualizar la probabilidad predicha